package com.guzhi;

//冒泡排序
//冒泡排序（为什么要用两层循环，因为冒泡排序有2个步骤并且这2个步骤有联系。外层循环为内层循环提供了一个框架，确定了排序需要进行多少轮。而内层循环则是排序算法的核心部分，负责在每一轮中执行具体的比较和交换操作。）
//i是外层循环的变量，代表当前遍历的轮数（为了方便，与数组开始索引值统一，所以轮数从0开始）或已排序好元素的数量。
//外层循环的主要作用是控制排序的总轮数，每一轮遍历都代表了一次完整的比较和可能的交换过程（外层包含了内层）。
//j是内层循环的变量，用作数组的索引（就是数组的地址和里面的储存的值没有关系），用于访问和比较元素，将数组里面的值交换位置
//内层循环负责在每一轮遍历中执行实际的比较和交换操作。
//很多东西都是想知道大概再详细做，所以控制遍历次数的才外层，相当于框架（模板），而详细操作放里面，和Java核心思想不谋而合，先有模板（类），里面再把详细的写出来
//冒泡排序i是轮数，j是数组索引

import java.util.Arrays;

public class Bubble {
    //构造方法
        public Bubble() {
        }

    //成员方法
        //判断v是否大于w
        public static boolean greater(int v,int w){
            return v>w;
        }
        //交换数组中索引i和所有j的值
        public static void exch(int[]a,int i,int j){
            int temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
        //对数组内的元素进行排序
        public static void sort(int[]a){
            //外层循环，i是已完成遍历的轮数； eg：6个元素需要进行5轮遍历1，2，3，4，5（i<a.length相当于i<=a.length-1）
            for(int i=1;i<a.length;i++){
                //内层循环，j是遍历实际数组（的索引）索引从0开始
                for(int j=0;j<a.length-i;j++){//内层循环从数组索引0开始判断；（减i就是动态缩小范围）
                    //判断当前索引下的值是否比下一个索引下的值大
                    if(greater(a[j],a[j+1])){
                        //如果大就交换位置
                        exch(a,j+1,j);
                    }
                }
            }
        }
}
